/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.daos;

import Persistencia.CRUD;
import Persistencia.DAO;
import Persistencia.SeqHelper;
import Persistencia.modelos.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;

/**
 *
 * @author Bruno
 */
public class GolsDAO implements DAO<Integer, Gols> {

    public void salva(Gols obj) {
        //Pessoa pessoa = (Pessoa) obj;               
        //CRUD.adiciona("Gols", obj.getFieldsToInsertAsString(),  obj.getFieldContentToInsertAsString());

        int i = SeqHelper.getId("gols");
        String jogador = ((obj.getJogador() == null) ? "null, " : obj.getJogador().getIdPessoa() + ",");
        String time = ((obj.getTime() == null) ? "null, " : obj.getTime().getIdTime() + ",");
        String partida = ((obj.getPartida() == null) ? "null, " : obj.getPartida().getNroPartida() + ",");

        CRUD.adiciona("Gols", "IDGOLS, IDJOGADOR,IDTIME,NROPARTIDA", i + "," + jogador + "," + time + " , " + partida);
    }

    public void atualiza(Gols obj) {
        List<String> c = new ArrayList<String>();
        c.add("IDGOLS");
        if (obj.getJogador() != null) {
            c.add("IDJOGADOR");
        }
        if (obj.getTime() != null) {
            c.add("IDTIME");
        }
        if (obj.getPartida() != null) {
            c.add("NROPARTIDA");
        }

        List<String> a = new ArrayList<String>();
        a.add(String.valueOf(obj.getJogador().getIdPessoa()));
        a.add(String.valueOf(obj.getTime().getIdTime()));
        a.add(String.valueOf(obj.getPartida().getNroPartida()));
        CRUD.atualiza("Gols", c, a, " where IDGols = " + obj.getIdGols());

    }

    public void deleta(Integer obj) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(obj);
        String campo = "idGols";
        CRUD.deleta("Gols", campo, list);
    }

    public Gols recupera(Integer obj) {
        try {            
            ResultSet rs = CRUD.consulta("select * from Gols  where idGols = " + obj);

            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> jogadoresAux = new TreeSet<Integer>();
            Collection<Integer> partidasAux = new TreeSet<Integer>();

            Gols g = null;
            if (rs.next()) {
                g = new Gols();
                g.setNroPartida(rs.getInt("nroPartida"));
                g.setIdTime(rs.getInt("idTime"));
                g.setIdJogador(rs.getInt("idJogador"));

                timesAux.add(g.getIdTime());
                jogadoresAux.add(g.getIdJogador());
                partidasAux.add(g.getNroPartida());                
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<Jogador> jogadores = new JogadorDAO().recuperaLista(jogadoresAux);
            Collection<Partida> partidas = new PartidaDAO().recuperaLista(partidasAux);

            preencheRelacionamentos(times, g, jogadores, partidas);

            return g;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Gols> recuperaLista(Collection<Integer> chaves) {
        try {
            StringBuilder sb = new StringBuilder();
            Iterator<Integer> it = chaves.iterator();
            while (it.hasNext()) {
                sb.append(it.next()).append(",");
            }
            String ids = sb.toString().substring(0, sb.toString().length() - 1);


            ResultSet rs = CRUD.consulta("select * from Gols  where idGols in (" + ids + ")");

            Collection<Gols> goles = new ArrayList<Gols>();
            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> jogadoresAux = new TreeSet<Integer>();
            Collection<Integer> partidasAux = new TreeSet<Integer>();


            while (rs.next()) {
                Gols g = new Gols();
                g.setNroPartida(rs.getInt("nroPartida"));
                g.setIdTime(rs.getInt("idTime"));
                g.setIdJogador(rs.getInt("idJogador"));

                timesAux.add(g.getIdTime());
                jogadoresAux.add(g.getIdJogador());
                partidasAux.add(g.getNroPartida());
                goles.add(g);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<Jogador> jogadores = new JogadorDAO().recuperaLista(jogadoresAux);
            Collection<Partida> partidas = new PartidaDAO().recuperaLista(partidasAux);

            for (Gols g : goles) {
                preencheRelacionamentos(times, g, jogadores, partidas);
            }

            return goles;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Gols> recuperaTodos() {
        try {
            Collection<Gols> goles = new ArrayList<Gols>();
            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> jogadoresAux = new TreeSet<Integer>();
            Collection<Integer> partidasAux = new TreeSet<Integer>();

            ResultSet rs = CRUD.consulta("select * from Gols");

            while (rs.next()) {
                Gols g = new Gols();
                g.setIdGols(rs.getInt("idGols"));
                g.setNroPartida(rs.getInt("nroPartida"));
                g.setIdTime(rs.getInt("idTime"));
                g.setIdJogador(rs.getInt("idJogador"));

                timesAux.add(g.getIdTime());
                jogadoresAux.add(g.getIdJogador());
                partidasAux.add(g.getNroPartida());
                goles.add(g);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<Jogador> jogadores = new JogadorDAO().recuperaLista(jogadoresAux);
            Collection<Partida> partidas = new PartidaDAO().recuperaLista(partidasAux);

            for (Gols g : goles) {
                preencheRelacionamentos(times, g, jogadores, partidas);
            }

            return goles;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    private void preencheRelacionamentos(Collection<Time> times, Gols g, Collection<Jogador> jogadores, Collection<Partida> partidas) {
        Time time = null;
        for (Time t: times){
            if (t.getIdTime() == g.getIdTime()){
                time = t;
                break;
            }
        }
        g.setTime(time);
        
        Jogador jogador = null;
        for (Jogador j: jogadores){
            if (j.getIdPessoa() == g.getIdJogador()){
                jogador = j;
                break;
            }
        }        
        g.setJogador(jogador);
        
        Partida partida = null;
        for (Partida p:partidas){
            if (p.getNroPartida() == g.getNroPartida()){
                partida = p;
                break;
            }
        }             
        g.setPartida(partida);        
    }
}
